package cn.tedu.charging.order.config;

import cn.tedu.charging.common.pojo.consts.AmqpComponentConst;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 在项目中需要任何组件的时候 使用这个配置类来声明
 */
@Configuration
public class AmqpDeclareConfiguration {
    /*//我们想要声明一个队列 叫做demo_queue
    @Bean
    public Queue demoQueue(){
        //channel.queueDeclare(名字,false,false,false,null)
        //方法1 参数接近底层声明参数值
        *//*return new Queue(
                "demo_queue",
                false,
                false,
                false,
                null);*//*
        //方法2,框架简化了构建过程,可以让代码使用builder构建器创建声明队列对象
        return QueueBuilder.nonDurable("demo_queue").build();
    }
    //声明一个交换机 demo_direct 路由模式的
    @Bean
    public Exchange demoExchange(){
        //channel.exchangeDeclare(名字,类型)
        return ExchangeBuilder.directExchange("demo_direct").build();
    }
    //将这个队列绑定给这个交换机用的路由key值 demo_rk
    @Bean
    public Binding demoBind(){
        //channel.queueBind(队列名,交换机名,路由key)
        return BindingBuilder.bind(demoQueue())
                .to(demoExchange()).with("demo_rk").noargs();
    }*/

    //设计和声明一套延迟队列交换机的架构??
    //声明延迟交换机 类型fanout
    @Bean
    public Exchange delayBillEx(){
        return ExchangeBuilder.fanoutExchange(AmqpComponentConst.DELAY_BILL_EX).build();
    }
    //声明死信交换机
    @Bean
    public Exchange delayBillDlEx(){
        return ExchangeBuilder.directExchange(AmqpComponentConst.DELAY_BILL_DL_EX).build();
    }
    //死信队列
    @Bean
    public Queue delayBillDlQueue(){
        return QueueBuilder.nonDurable(AmqpComponentConst.DELAY_BILL_DL_QUEUE).build();
    }
    //延迟队列 在声明的同时 只需要绑定2个额外的死信相关属性
    //死信交换机 和 死信路由key
    @Bean
    public Queue delayBillQueue(){
        return QueueBuilder.nonDurable(AmqpComponentConst.DELAY_BILL_QUEUE)
                .deadLetterExchange(AmqpComponentConst.DELAY_BILL_DL_EX)//设置死信交换机
                .deadLetterRoutingKey(AmqpComponentConst.DELAY_BILL_DL_RK)//设置死信路由
                .build();
    }
    //绑定延迟交换机和延迟队列的关系 不需要路由key
    @Bean
    public Binding delayBillBind(){
        return BindingBuilder.bind(delayBillQueue()).to(delayBillEx()).with("").noargs();
    }
    //死信交换机和死信队列 使用死信路由绑定
    @Bean
    public Binding delayBillDlBind(){
        return BindingBuilder.bind(delayBillDlQueue()).to(delayBillDlEx()).with(AmqpComponentConst.DELAY_BILL_DL_RK).noargs();
    }
}
